package br.com.sovi.gwt.server.service.autenticacao;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.Cookie;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;

import org.codehaus.jettison.json.JSONObject;

import br.com.sovi.gwt.client.autenticacao.service.AutenticacaoService;
import br.com.sovi.gwt.client.entity.autenticacao.Usuario;
import br.com.sovi.gwt.server.Constants;
import br.com.sovi.gwt.server.json.entity.UsuarioVO;
import br.com.sovi.gwt.server.rest.RestController;
import br.com.sovi.gwt.server.service.CurrentToken;
import br.com.sovi.gwt.server.service.CurrentUsuario;

import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.GenericType;
import com.sun.jersey.api.client.WebResource;

public class AutenticacaoServiceImpl extends RemoteServiceServlet implements AutenticacaoService {
	private static final long serialVersionUID = 1L;

	@Override
	public List<Usuario> getUsuariosByCodigoEmpresa(String codigo) {

		try {
			String url = Constants.BASE_URL + "/autenticacao/getUsuarioByCodigoEmpresa?codigo=" + codigo;

			List<UsuarioVO> vos = (List<UsuarioVO>) RestController.get(url, new GenericType<List<UsuarioVO>>() {
			});

			List<Usuario> beans = new ArrayList<Usuario>();

			for (UsuarioVO usuarioVO : vos) {
				beans.add(usuarioVO.toUsuario());
			}

			return beans;
		}
		catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public Usuario efetuarLogin(String login, String senha) {

		try {
			String url = Constants.BASE_URL + "/autenticacao/efetuarLogin";

			StringBuilder sb = new StringBuilder();
			sb.append("login=").append(login);
			sb.append("&senha=").append(senha);

			Client client = Client.create();

			WebResource resource = client.resource(url);

			ClientResponse response = resource.type(MediaType.APPLICATION_JSON).post(ClientResponse.class,
					sb.toString());

			MultivaluedMap<String, String> headers = response.getHeaders();

			List<String> list = headers.get(RestController.TOKEN_AUTH);

			if (list != null && !list.isEmpty()) {
				String token = list.get(0);

				getThreadLocalResponse().addCookie(new Cookie(CurrentToken.TOKEN, token));

				try {
					UsuarioVO entity = response.getEntity(UsuarioVO.class);
					CurrentUsuario.setCurrent(entity.toUsuario());
					return entity.toUsuario();
				}
				catch (Exception e) {
					return null;
				}
			}
			else {
				return null;
			}
		}
		catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public Usuario getUsuarioLogado() {
		return CurrentUsuario.getCurrent();
	}

}
